昨天我們完成了邏輯面上的棋盤初始化與更新,今天開始進入 視覺化渲染階段。
我們會用 Ebiten 提供的 DrawRect 與 Image 功能,畫出一個簡單的 4x4 棋盤格背景,為後續數字渲染做準備。
package layout
import (
"image/color"
"github.com/hajimehoshi/ebiten/v2"
)
const (
tileSize = 100
gridSize = 4
padding = 10
WinWidth = tileSize*gridSize + padding*(gridSize+1)
WinHeight = tileSize*gridSize + padding*(gridSize+1)
)
type GameLayout struct{}
func (g *GameLayout) Draw(screen *ebiten.Image) {
// 背景色
screen.Fill(color.RGBA{250, 248, 239, 255})
// 畫 4x4 格子
for row := 0; row < gridSize; row++ {
for col := 0; col < gridSize; col++ {
op := &ebiten.DrawImageOptions{}
x := padding + col*(tileSize+padding)
y := padding + row*(tileSize+padding)
rect := ebiten.NewImage(tileSize, tileSize)
rect.Fill(color.RGBA{205, 193, 180, 255})
op.GeoM.Translate(float64(x), float64(y))
screen.DrawImage(rect, op)
}
}
}
func (g *GameLayout) Layout(outsideWidth, outsideHeight int) (int, int) {
return WinWidth, WinHeight
}
func (g *GameLayout) Update() error {
return nil
}
func NameGameLayout() *GameLayout {
return &GameLayout{}
}
package main
import (
"log"
"github.com/hajimehoshi/ebiten/v2"
"github.com/leetcode-golang-classroom/2048-game/internal/layout"
)
func main() {
ebiten.SetWindowSize(layout.WinWidth, layout.WinHeight)
ebiten.SetWindowTitle("2048 - Day 7 測試")
game := layout.NameGameLayout()
if err := ebiten.RunGame(game); err != nil {
log.Fatal(err)
}
}
為了日後建制方便,所以開始建立 makefile 腳本
.PHONY=build
build-game:
@CGO_ENABLED=1 GOOS=linux go build -o bin/2048-game cmd/main.go
run-game: build-game
@./bin/2048-game
coverage:
@go test -v -cover ./internal/game/...
test:
@go test -v ./internal/game/...
由於 ebiten 畫面渲染需要使用到 cgo 所以在 build 的時候需要開啟 CGO_ENABLED 的 flag
https://github.com/leetcode-golang-classroom/2048-game/actions/runs/17104773005
明天我們將 在格子中顯示數字與顏色變化,讓棋盤開始有「遊戲感」。
我們會根據不同數字設定不同顏色與文字大小,並學會用 text.Draw 在 Ebiten 上畫字。